<?php
/*
 * Класс-предок виджета, содержит в себе составные части контроллера касающиеся обработки формы
 * Концепция методов следующая. Каждый метод инкапсулирует в себя операцию обработки (например проверку прав)
 * Если операция неудачна, то метод записывает cpaint'у код ошибки и возвращает false.
 * Если удачна, то вернет true.
 * 
 * Если методу который вызывает эти обработчики нужно передавать переменные (например id раздела), то они 
 * устанавливаются полями объекта.
 *  
 * @author Alexander Sibiryakov
 */
abstract class SectionsManageFormHandler extends MainPageWidget {
	public $section_oid;

	public function validate($form) {
		$cp = $this->ctx->cp;
		$val_config = array(
			"title"=>array("validators"=>array("length", "isPresent", "notEmpty"), "validator_params"=>array("max_len"=>30)),
			"url"=>array("validators"=>array("isReserved", "isPresent", "Url", "notEmpty")),
			"feed"=>array("validators"=>array("isPresent", "notEmpty")),
			"def_doctype"=>array("validators"=>array("isPresent")),
			"tags"=>array("validators"=>array("isPresent")),
		); 
		
		$val = new FormValidator($val_config);
		$val->setData($form);
		$val->process();
		$errors = $val->getErrors();
		
		// есть ошибки валидации - отправляем данные с ними
		if (count($errors) > 0) {
			foreach ($errors as $name=>$etext) {
				$en = $cp->add_node("error");
				$en->add_node("fieldname")->set_data($name);
				$en->add_node("errortext")->set_data($etext);
			}
			$cp->set_data(3); // произошли ошибки
			return false;
		}
		return true;
	}
	
	private function mapVars($form) {
		$aa = $this->acl_assistant;
		$community_oid = $aa->acl_data['comity_oid'];
		
		// пробуем создать раздел с такими данными
		$sect['community_oid'] = $community_oid;
		$sect['title'] = $form['title']; 
		$sect['itype'] = $form['def_doctype'];
		$sect['url'] = $form['url'];
		$sect['view'] = $form['feed'];
		$sect['tags'] = $form['tags']; 
		$sect['show_in_main_menu'] = ($form['show_in_main_menu']=="on") ? true : false;
		return $sect;
	}
	
	public function createSection($form) {
		$aa = $this->acl_assistant;
		$community_oid = $aa->acl_data['comity_oid']; 
		$cp = $this->ctx->cp;
		$sect = $this->mapVars($form);
		
		$m_sect = $this->ctx->mm->getModel("Tdi");
		if (!($sect = $m_sect->createTdi($sect))) {
			$cp->set_data(2); // не смогли раздел создать
			$this->ctx->db->rollback();
			return false;
		}
		
		$aa->createTdi($community_oid, $sect->id, $sect->data['title']);
		if ($this->ctx->db->isErrorInTransaction()) {
			$cp->set_data(2);
			$this->ctx->db->rollback();
			return false;
		}
		$this->section_oid = $sect->id;
		return true;
	}

	public function updateSection($form) {
		$aa = $this->acl_assistant;
		$cp = $this->ctx->cp;
				
		$sect = $this->mapVars($form);
				
		$m_sect = $this->ctx->mm->getModel("Tdi");
		$sect_obj = $m_sect->changeTdi($this->section_oid, $sect);
		
		if (!$sect_obj) {
			$cp->set_data(5); // не смогли раздел создать
			$this->ctx->db->rollback();
			return false;
		}
		
		return true;
	}

	
	public function updateAcl($form) {
		
		$aa = $this->acl_assistant;
		$community_oid = $aa->acl_data['comity_oid']; 
		
		$cp = $this->ctx->cp;
		// обновим права
		$community_roles = $this->loadCommunityRoles($community_oid);		
		
		$status = 0; // код результата работы функции
		$managable_actions = array_keys($this->managable_actions);
		foreach ($community_roles as $role) {
			$role_oid = $role['id_object'];
			$acls = array();
			foreach ($managable_actions as $act_alias) {
				// нам прислали установки экшенов для данной роли
				if (isset($form['acl'][$role_oid][$act_alias])) {
					$acls[$act_alias] = 1;
				} else {
					// если нет -- запрещаем
					$acls[$act_alias] = 0;
				}
			}
			
			$result = $aa->updateAcl($this->section_oid, $acls, $role_oid); 
			if ($result !== true || $this->ctx->db->isErrorInTransaction()) {
				$cp->set_data(4);
				$this->ctx->db->rollback();
				return false;
			}
		}
		
		if ($this->ctx->db->isErrorInTransaction()) {
			$cp->set_data(4);
			$this->ctx->db->rollback();
			return false;
		}
		
		return true;
	}
	
}
